#ifndef RSACRYPTO_H
#define RSACRYPTO_H


#include <string>
#include <map>
#include "openssl/evp.h"
#include "Hash.h"
using namespace std;

// RSA非对称加密算法
class RsaCrypto {
public:
    enum KeyLength { // 秘钥对的长度(位数)
        BITS_1k = 1024,
        BITS_2k = 2048,
        BITS_3k = 3072,
        BITS_4k = 4096
    };

    enum KeyType { PublicKey, PrivateKey }; // 秘钥类型

    explicit RsaCrypto() = default;

    // 构造对象并加载秘钥文件中的数据到内存中
    explicit RsaCrypto(string fileName, KeyType type);

    ~RsaCrypto();

    // 将秘钥字符串data解析成秘钥类型
    void parseStringToKey(string data, KeyType type);

    // 生成密钥对: pub为存储公钥的PEM文件, pri为存储私钥的PEM文件
    void generateRsaKey(KeyLength bits, string pub = "public.pem", string pri = "private.pem");

    string pubKeyEncrypt(string data); // 用公钥加密[明文data]得到密文, 并返回[Base64对密文进行编码之后的结果]
    string priKeyDecrypt(string data); // 用私钥解密[密文data], 返回明文 (data经过了Base64的编码)

    // 数据签名: hashMethod用于指定要使用的哈希算法
    string sign(string data, HashType hashMethod = HashType::Sha256);

    // 签名校验: sign为签名, data为待检验的数据 (sign是经过Base64编码的)
    bool verify(string sign, string data, HashType hashMethod = HashType::Sha256);

private:
    EVP_PKEY* _pubKey = NULL; // 只有公钥
    EVP_PKEY* _priKey = NULL; // 私钥+公钥
};

#endif //RSACRYPTO_H
